home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / tools / fndenv.com / FINDENV.ASM < prev   
Encoding:
Assembly Source File  |  1988-10-28  |  4.3 KB  |  99 lines

  1.                    PAGE      60,132
  2.                    TITLE     Locate DOS master environment address
  3.  
  4.                    .MODEL    small
  5.  
  6.                    INCLUDE   dos.cpy                       ;ms-dos equates
  7.                    INCLUDE   asmequ.cpy                    ;std asm equates
  8.  
  9.                    .CODE
  10.  
  11.                    PUBLIC    FindEnv
  12.  
  13. EnvPtr             EQU       2CH                           ; Offset in PSP
  14. CommandPtr         EQU       2EH       ; entry point into first Command.Com
  15. DosSegPtr          EQU       CommandPtr * 4 + 2
  16. EnvLen             EQU       [BP+6]                        ;passed parms
  17. EnvSeg             EQU       [BP+4]
  18.  
  19. ;----------------------------------------------------------;
  20. ;  This routine finds the 'master' Environment block for   ;
  21. ;  DOS.  If it can't find it, it passes back the local     ;
  22. ;  Environment block.                                      ;
  23. ;                                                          ;
  24. ;  Calling sequence;                                       ;
  25. ;                                                          ;
  26. ;    MOV       AX,OFFSET EnvLen      ;returned length      ;
  27. ;    PUSH      AX                                          ;
  28. ;    MOV       AX,OFFSET EnvSeg      ;returned seg address ;
  29. ;    PUSH      AX                                          ;
  30. ;    CALL      FindEnv                                     ;
  31. ;    JC        A800_NoEnv            ;check for errors     ;
  32. ;                                                          ;
  33. ;----------------------------------------------------------;
  34. FindEnv            PROC
  35.                    PUSH      BP                            ;set up linkage
  36.                    MOV       BP,SP
  37.                    PUSH      AX                            ;save registers
  38.                    PUSH      SI
  39.  
  40.                    XOR       SI,SI                         ;point to low core
  41.                    MOV       ES,SI                         ;  with ES
  42.                    MOV       SI,WORD PTR ES:[DosSegPtr]    ;command.com interupt
  43.                    MOV       AX,SI                         ;pass to VerifyBlock
  44.                    CALL      VerifyBlock
  45.                    JNZ       GotBlock                      ;got block (our PSP)
  46.  
  47.                    MOV       AX,ES:[EnvPtr+10h]   ; get COMMAND's environment ptr
  48.                    OR        AX,AX                ; jump if COMMAND has a
  49.                    JNZ       MaybeGoodBlock       ; subsidiary environment
  50.  
  51.                    MOV       AX,SI                ; If no subsidiary, just use
  52.                    ADD       AX,CX                ; the allocation block
  53.                    INC       AX                   ; immediately after COMMAND
  54.  
  55. MaybeGoodBlock:    CALL      VerifyBlock          ; verify that it's good
  56.  
  57. GotBlock:
  58.                    SHL       CX,1                 ; multiply by 16 to get
  59.                    SHL       CX,1                 ; length in bytes
  60.                    SHL       CX,1
  61.                    SHL       CX,1
  62.                    MOV       DI,EnvLen                     ;pass back parms
  63.                    MOV       [DI],CX
  64.                    MOV       DI,EnvSeg
  65.                    MOV       [DI],AX
  66.  
  67.                    POP       SI
  68.                    POP       AX
  69.                    POP       BP
  70.  
  71.                    RET       2*2
  72.  
  73. FindEnv            ENDP
  74.  
  75. ; VerifyBlock tries to insure that we're pointing to a valid DOS
  76. ; allocation block.  If not, returns the current process's environment
  77. ; block.
  78.  
  79.  
  80. VerifyBlock        PROC
  81.                    DEC       AX                      ; get block header into ES
  82.                    MOV       ES,AX
  83.                    INC       AX
  84.  
  85.                    CMP       BYTE PTR ES:[0],04Dh    ; make sure signature is valid
  86.                    JNZ       UseCurrent
  87.                    CMP       WORD PTR ES:[1],si      ; make sure owner is valid
  88.                    JNZ       UseCurrent
  89.                    MOV       CX, WORD PTR ES:[3]     ; retrieve the length
  90.                    RET
  91.  
  92. UseCurrent:        MOV       AX,WORD PTR DS:[EnvPtr] ; get current process's env
  93.                    XOR       CX,CX                   ; zero length
  94.                    RET
  95.  
  96. VerifyBlock        ENDP
  97.  
  98.                    END
  99.